package com.hgl.bi.common.manager;

import com.alibaba.excel.EasyExcel;
import com.hgl.bi.common.config.COSClientConfig;
import com.qcloud.cos.COSClient;
import com.qcloud.cos.http.HttpMethodName;
import com.qcloud.cos.model.GeneratePresignedUrlRequest;
import com.qcloud.cos.model.GetObjectRequest;
import com.qcloud.cos.model.PutObjectResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * @program: BI
 * @description: 腾讯云对象存储
 * @author: hgl
 * @create: 2025-02-09 19:05
 */
@Component
public class COSManager {

    @Autowired
    private COSClientConfig cosConfig;

    @Autowired
    private COSClient cosClient;

    /**
     * 获取文件内容
     *
     * @param cosPath 文件路径
     * @return List<Map < Integer, String>>
     * @author hgl
     */
    public List<Map<Integer, String>> syncReadContent(String cosPath) throws IOException {
        // 创建缓冲输入流
        try (InputStream inputStream = cosClient.getObject(
                        new GetObjectRequest(cosConfig.getBucketName(), cosPath))
                .getObjectContent();
             BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream)) {
            // 读取文件内容
            return EasyExcel.read(bufferedInputStream)
                    .sheet()
                    .headRowNumber(0)
                    .doReadSync();
        }
    }

    /**
     * 上传文件
     *
     * @param cosPath 文件路径
     * @param file    文件
     * @return PutObjectResult
     * @author hgl
     */
    public PutObjectResult putObject(String cosPath, File file) {
        // 上传文件
        return cosClient.putObject(cosConfig.getBucketName(), cosPath, file);
    }

    /**
     * 获取文件访问签名
     *
     * @param key 文件路径
     * @param expiredTime 有效期（毫米）
     * @return 临时访问签名
     */
    public String getAccessSignature(String key, Long expiredTime) {
        GeneratePresignedUrlRequest req = new GeneratePresignedUrlRequest(cosConfig.getBucketName(), key);
        req.setMethod(HttpMethodName.GET);
        req.setExpiration(new Date(System.currentTimeMillis() + expiredTime)); // 有效期
        URL url = cosClient.generatePresignedUrl(req);
        return url.toString();
    }

    /**
     * 获取文件上传签名
     *
     * @param key 文件路径
     * @param expiredTime 有效期（毫米）
     * @return 临时上传签名
     */
    public String getUploadSignature(String key, Long expiredTime) {
        GeneratePresignedUrlRequest req = new GeneratePresignedUrlRequest(cosConfig.getBucketName(), key);
        req.setMethod(HttpMethodName.PUT); // 使用 PUT 方法
        req.setExpiration(new Date(System.currentTimeMillis() + expiredTime)); // 设置有效期
        URL url = cosClient.generatePresignedUrl(req);
        return url.toString();
    }

    /**
     * 获取文件下载签名
     *
     * @param key 文件路径
     * @param expiredTime 有效期（毫米）
     * @return 临时下载签名
     */
    public String getDownloadSignature(String key, Long expiredTime) {
        GeneratePresignedUrlRequest req = new GeneratePresignedUrlRequest(cosConfig.getBucketName(), key);
        req.setMethod(HttpMethodName.GET); // 使用 GET 方法
        req.setExpiration(new Date(System.currentTimeMillis() + expiredTime)); // 设置有效期
        URL url = cosClient.generatePresignedUrl(req);
        return url.toString();
    }
}
